home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / nose / nose.c < prev   
C/C++ Source or Header  |  1993-01-28  |  3KB  |  170 lines

  1. /* (picked "name" (gx gy gz) (vx vy vz) (x1 y1 z1 x2 y2 z2)) */
  2.  
  3. #include <stdio.h>
  4. #include "lisp.h"
  5. #include "pickfunc.h"
  6. #include "3d.h"
  7. #include "handleP.h"
  8. #include "ooglutil.h"
  9.  
  10. void deflittlebox(FILE *fp, float size);
  11. void norm(FILE *fp);
  12.  
  13. int verbose = 0;
  14.  
  15. handle_pick(FILE *fp, int picked, HPoint3 *gotten,
  16.         int vert, HPoint3 *v, int edge, HPoint3 e[])
  17. {
  18.   static int first = 1;
  19.   HPoint3 got, e0, e1;
  20.  
  21.   HPt3Normalize(&e[0], &e0);
  22.   HPt3Normalize(&e[1], &e1);
  23.   HPt3Normalize(gotten, &got);
  24.   fprintf(fp, "(progn\n");
  25.   if (!picked) {
  26.     fprintf(fp,"(geometry \"pick\" { LIST } )\n");
  27.   } else {
  28.     fprintf(fp,"(xform-set pick { 1 0 0 0  0 1 0 0  0 0 1 0  %g %g %g 1 })\n",
  29.     got.x, got.y, got.z);
  30.     fprintf(fp,"(geometry \"pick\"\n");
  31.     if (vert) fprintf(fp, "{ appearance { material { diffuse 1 0 1 } }\n");
  32.     else fprintf(fp, "{ appearance { material { diffuse 1 1 0 } }\n");
  33.     fprintf(fp, "  { LIST { :littlebox }\n");
  34.  
  35.     if (edge && !vert) {
  36.     e0.x -= got.x; e0.y -= got.y; e0.z -= got.z;
  37.     e1.x -= got.x; e1.y -= got.y; e1.z -= got.z;
  38.     fprintf(fp,"{ appearance { material { diffuse 0 1 1 } }\n\
  39.   LIST\n\
  40.    { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
  41.    { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
  42.    { VECT\n\
  43.       1 2 1\n\
  44.       2\n\
  45.       1\n\
  46.       %f %f %f\n\
  47.       %f %f %f\n\
  48.       1 1 0 1\n\
  49.    }\n\
  50.   }\n",
  51.          e0.x, e0.y, e0.z,
  52.          e1.x, e1.y, e1.z,
  53.          e0.x, e0.y, e0.z,
  54.          e1.x, e1.y, e1.z);
  55.     }
  56.     fprintf(fp,"    }\n  }\n)\n");
  57.   }
  58.   if (first) {
  59.     fprintf(fp, "(pickable \"pick\" no)\n");
  60.     first = 0;
  61.   }
  62.   fprintf(fp, ")\n");
  63.   fflush(fp);
  64. }
  65.  
  66. DEFPICKFUNC("(pick COORDSYS GEOMID G V E F P VI EI FI)",
  67.         coordsys,
  68.         id,
  69.         point, pn,
  70.         vertex, vn,
  71.         edge, en,
  72.         face, fn, 10,
  73.         ppath, ppn, 50,
  74.         vi,
  75.         ei, ein,
  76.         fi,
  77. {        
  78.   int picked = pn > 0;
  79.   handle_pick(stdout, picked, &point, vn>0, &vertex, en>0, edge);
  80.   if (verbose)
  81.     handle_pick(stderr, picked, &point, vn>0, &vertex, en>0, edge);
  82.   return Lt;
  83. })
  84.  
  85.  
  86. init()
  87. {
  88.   LInit();
  89.   LDefun("pick", Lpick, Hpick);
  90. }
  91.  
  92. pickability(FILE *fp)
  93. {
  94.   fprintf(fp, "(interest (pick world * * * * nil nil nil nil nil))\n");
  95.   fflush(fp);
  96. }
  97.  
  98. main()
  99. {
  100.   Lake *lake;
  101.   LObject *lit, *val;
  102.   extern char *getenv();
  103.  
  104.   verbose = (getenv("VERBOSE_NOSE") != NULL);
  105.  
  106.   fprintf(stdout, "(progn\n");
  107.   init();
  108.   deflittlebox(stdout, 0.04);
  109.   if (verbose) deflittlebox(stderr, 0.04);
  110.  
  111.   pickability(stdout);
  112.   if (verbose) pickability(stderr);
  113.  
  114.   norm(stdout);
  115.   if (verbose) norm(stderr);
  116.  
  117.   fprintf(stdout, ")\n");
  118.   fflush(stdout);
  119.  
  120.   lake = LakeDefine(stdin, stdout, NULL);
  121.   while (!feof(stdin)) {
  122.     lit = LSexpr(lake);
  123.     val = LEval(lit);
  124.     LFree(lit);
  125.     LFree(val);
  126.   }
  127. }
  128.  
  129. void
  130. norm(FILE *fp)
  131. {
  132.   fprintf(fp, "(geometry \"pick\" { LIST } )\n");
  133.   fprintf(fp, "(normalization \"pick\" none)\n");
  134.   fprintf(fp, "(bbox-draw \"pick\" off)\n");
  135.   fflush(fp);
  136. }
  137.  
  138.  
  139. void
  140. deflittlebox(FILE *fp, float size)
  141. {
  142.   fprintf(fp,"\
  143.   (read geometry { define littlebox {\n\
  144.     INST\n\
  145.       transform %f 0 0 0\n\
  146.             0 %f 0 0\n\
  147.             0 0 %f 0\n\
  148.             0 0 0  1\n\
  149.       geom\n\
  150.       OFF\n\
  151.       8 6 12\n\
  152. \n\
  153.       -.5 -.5 -.5    # 0   \n\
  154.        .5 -.5 -.5    # 1   \n\
  155.        .5  .5 -.5    # 2   \n\
  156.       -.5  .5 -.5    # 3   \n\
  157.       -.5 -.5  .5    # 4   \n\
  158.        .5 -.5  .5    # 5   \n\
  159.        .5  .5  .5    # 6   \n\
  160.       -.5  .5  .5    # 7   \n\
  161. \n\
  162.       4 0 1 2 3\n\
  163.       4 4 5 6 7\n\
  164.       4 2 3 7 6\n\
  165.       4 0 1 5 4\n\
  166.       4 0 4 7 3\n\
  167.       4 1 2 6 5\n\
  168.       }})\n", size, size, size);
  169. }
  170.